(common.inc.plp)><: my %scver = ( id => 'bw', name => 'Brood War', title => 'starcraft', game => 'StarCraft', major => 1, ); if ($ENV{PATH_INFO} and $ENV{PATH_INFO} eq '/2') { %scver = ( id => 'hots', name => 'Heart of the Swarm', title => 'starcraft2', game => 'StarCraft II', major => 2, ); } my $datafile = "sc-units-$scver{id}.inc.pl"; Html({ title => "$scver{title} unit cheat sheet", version => 'v1.1', description => [ "Reference of $scver{game} unit properties," . " comparing various statistics of all the units in $scver{name}" . ' including costs, damage, defense, speed, ranges, and abilities.', ], keywords => [ qw' starcraft game unit statistics stats comparison table sheet cheat reference software attributes properties ', $scver{major} < 2 ? qw' bw broodwar brood war ' : qw' starcraft2 hots ', ], stylesheet => [qw'light'], raw => '', data => [$datafile], }); print "
Unit properties as seen or measured in $scver{name}\n$patch.\n
\n\n"; sub coltoggle { my ($name, $id) = @_; return sprintf( (defined $get{order} ? $get{order} eq $id : !$id) ? '%2$s ▼' : '%s', $id && "order=$id", $name ); } :><:= coltoggle('name', '') :> | <:= coltoggle(qw'build cost') :> | <:= coltoggle(qw'size size') :> | HP | shield | ⛨ | ground | dps | air | dps | range | sight | speed | specials | ' unless $attack; my $tagbase = ' | '; my $out = showval($row, 'attack', $area, 'damage'); $out .= '+' if $attack->{splash}; $attack->{dps} = $attack->{cooldown} && [ map { 24 * $_ / $attack->{cooldown} * ($attack->{count} // 1) } map { ref $_ ? @{$_} : $_ } $attack->{damage} #TODO: upgrade (zergling) ]; $out .= ' | ' . showval($row, 'attack', $area, 'dps'); return $tagbase . $out; } sub showmagic { my ($row) = @_; my $specials = $row->{special} or return ''; return join ' ', map { sprintf '%s', $_->{duration} < 0 && ' class="magic-perma"', join('', $_->{name}, $_->{desc} ? ": $_->{desc}" : '', $_->{range} || $_->{cost} ? sprintf(' (%s)', join ', ', $_->{range} ? "range $_->{range}" : (), $_->{cost} ? sprintf('cost %.0f%%%s', 100 * $_->{cost} / $row->{energy}, defined $_->{maint} && sprintf('+%.1f%%/s', 100 * $_->{maint} / $row->{energy}, ), ) : (), ) : '', ), sprintf($_->{build} ? '(%s)' : '%s', $_->{abbr}), } grep { defined $_->{abbr} } @{$specials}; } sub showunitcols { my ($row) = @_; local $_ = $row; $_->{hp} += $_->{shield} if $_->{shield}; my $suitchar = ''; if ($_->{attr}->{structure}) { $suitchar = 'b'; } elsif ($_->{suit}) { $suitchar = [qw/? s m l/]->[$_->{suit}]; } elsif ($_->{cargo} > 0) { $suitchar = [qw/? s m l l h h h h/]->[abs $_->{cargo}]; } elsif ($_->{size}) { $suitchar = [qw/s m l h h h/]->[$_->{size}]; } elsif ($_->{attr} and $_->{attr}->{light}) { $suitchar = 's'; } elsif ($_->{attr} and $_->{attr}->{armored}) { $suitchar = 'l'; } return ( ' | ' . ($_->{min} // ''), ' | ' . ($_->{gas} || ''), !defined $_->{build} ? ' | ' : sprintf(' | %s%.0f', !!$_->{base} && '+', $_->{build} || '0', ), !$suitchar ? ' | ' : sprintf(' | %s', $suitchar, ucfirst $suitchar), ' | ' . ( defined $_->{unit} && $_->{unit} == .5 ? '½' : $_->{unit} ), ' | ' . join('', grep { $_ } (defined $_->{organic} ? !$_->{organic} : $_->{attr}->{mech}) && 'm', ($_->{organic} || $_->{attr}->{organic}) && 'o', $_->{attr}->{psionic} && 'ψ', ), ' | ' . join('', grep { $_ } $_->{attr}->{armored} && 'A', $_->{attr}->{light} && 'L', ), ' | ' . $_->{hp} // '', $_->{shield} ? sprintf(' | %.0f%% | {shield} / $_->{hp} ) : ' | ' . showval($_, 'armor'), showattack($_, 'ground'), showattack($_, 'air'), ' | ' . showval($_, 'attack', 'range'), ' | ' . sprintf( $_->{detect} ? '%s' : '%s', showval($_, 'sight') ), ' | ' . showval($_, 'speed'), $_->{attr}->{massive} && '☇', ' | ' . showmagic($_), "\n" ); } my $grouped = 1; # race headers if (exists $get{order}) { $grouped = 0; $get{order} ||= ''; if ($get{order} eq 'size') { $_->{order} = $_->{unit}*8 + $_->{suit} + $_->{hp}/512 + $_->{min}/8192 for @$units; } elsif ($get{order} eq 'cost') { $_->{order} = $_->{gas}*1.5 + $_->{min} + $_->{unit}/8 + $_->{build}/256/8 for @$units; } else { $units->[$_]->{order} = $_ for 0 .. $#$units; } } my @rows = @{$units}; @rows = sort {$a->{order} <=> $b->{order}} @rows unless $grouped; my ($race, $cat) = ('', ''); for (@rows) { if ($grouped) { printf ' |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
%s'."\n", $race = $_->{race}, ucfirst $race unless $race eq $_->{race}; } else { $_->{cat} = $_->{race}; } print( ' | |||||||||||||||||||
', $cat ne $_->{cat} && ($cat = $_->{cat}), ' | ', $_->{name}, showunitcols($_), ); for my $subrow (@{ $_->{special} }) { $subrow->{alt} or next; print( ' | ||||||||||||||||||
', $subrow->{alt}, showunitcols($subrow), ); } } :> |
When two values are given (1-2), second value indicates attribute after all possible upgrades.